package top.jianx.storage.template;

import org.springframework.web.multipart.MultipartFile;
import top.jianx.storage.dto.BaseFile;

import java.io.InputStream;

/**
 * 〈StorageTemplate〉
 *
 * @author Jianx
 * @create 2022/3/20
 * @since 1.0.0
 */
public interface StorageTemplate {

    /**
     * 创建存储桶
     *
     * @param bucketName 存储桶名称
     */
    public void makeBucket(String bucketName);

    /**
     * 存储桶是否存在
     *
     * @param bucketName 存储桶名称
     * @return
     */
    public boolean bucketExists(String bucketName);

    /**
     * 获取文件外链
     *
     * @param bucketName 桶名称 {@linkplain String}
     * @param fileName 文件名称 {@linkplain String}
     * @param timelines 是否设置有效时间内访问文件 {@linkplain Boolean}
     * @return String
     */
    public String fileLink(String fileName, String bucketName, boolean timelines);

    /**
     * 获取文件外链
     *
     * @param bucketName 桶名称 {@linkplain String}
     * @param fileName 文件名称 {@linkplain String}
     * @param timelines 是否设置有效时间内访问文件 {@linkplain Boolean}
     * @param timeliness 设置的有效时间，单位：秒 {@linkplain Integer}
     * @return String
     */
    public String fileLink(String fileName, String bucketName, boolean timelines, Integer timeliness);

    /**
     * 上传文件
     *
     * @param bucketName   存储桶名称
     * @param originalName 上传文件名
     * @param file         文件
     * @return BaseFile
     */
    public BaseFile putFile(String bucketName, String module, String originalName, MultipartFile file);

    /**
     * 上传文件
     *
     * @param bucketName   存储桶名称
     * @param originalName 上传文件名
     * @param inputStream  文件
     * @return BaseFile
     */
    public BaseFile putFile(String bucketName, String module, String originalName, InputStream inputStream);

    /**
     * 上传文件
     *
     * @param bucketName   存储桶名称
     * @param stream       上传文件InputStream
     * @param originalName 上传文件名
     * @param cover        是否覆盖
     * @return BaseFile
     */
    public BaseFile put(String bucketName, String module, InputStream stream, String originalName, boolean cover);

    /**
     * 删除文件
     *
     * @param fileName   文件名称
     * @param bucketName 存储桶名称
     */
    public void removeFile(String bucketName, String fileName);

    /**
     * 根据规则生成存储桶名称规则
     *
     * @param bucketName 存储桶名称
     * @return String
     */
    public String getBucketName(String bucketName);

    /**
     * 根据规则生成文件名称规则
     *
     * @param originalFilename 原始文件名
     * @return string
     */
    public String getFileName(String module, String originalFilename);

    /**
     * 获取oss host
     *
     * @param bucketName 存储桶名称
     * @return String
     */
    public String getOssHost(String bucketName);

    /**
     * 获取文件流
     *
     * @param bucketName 存储桶
     * @param fileName   文件名
     * @return InputStream
     */
    public BaseFile getObject(String bucketName, String fileName);
}
